package com.hctforgreen.greenservice.utils.irremote;

import java.io.UnsupportedEncodingException;
import java.math.BigInteger;

import android.util.Log;

public class GreeIrFcode {
	private int[] passCode =new int[]{
			0x00, 0x00, 0x00, 0xF0, 0x0B, 0x00, 0x40, 0x00, 0x00
	};
	private int[][] fCode = new int[6][];// 二维表示F0~F3码总长度；一维表示有多少组F码，目前用于表示不同模式对应的一组码
	public GreeIrFcode() {
		initFcode();
	}
	private void initFcode()
	{
		//自动模式下默认F码
		fCode[0] = new int[] { 0x00, 0x09, 0x20, 0x50, 0xfa, 0x00, 0x40, 0x00,
				0x00, 0xff, 0x00, 0x00, 0x00, 0x60, 0xfa, 0x00, 0x00, 0x00,
				0x00, 0xff, 0x00, 0x00, 0x00, 0x70, 0xfa, 0x00, 0x00, 0x00,
				0x00, 0xff, 0x00, 0x00, 0x00, 0x80, 0xfa, 0x00, 0x00, 0x00,
				0x00, 0xff };
		//制冷模式下默认F码
		fCode[1] = new int[] { 0x09, 0x09, 0x20, 0x50, 0xfa, 0x00, 0x40, 0x00,
				0x00, 0xff, 0x00, 0x00, 0x00, 0x60,0xfa, 0x00, 0x00, 0x00,
				0x00, 0xff, 0x00, 0x00, 0x00, 0x70, 0xfa, 0x00, 0xa9, 0x00,
				0x00, 0xff, 0x00, 0x00, 0x00, 0x80, 0xfa, 0xbb, 0xbb, 0xab,
				0x00, 0xff };
		//除湿模式下默认F码
		fCode[2] = new int[] { 0x1a, 0x09, 0x20, 0x50, 0xfa, 0x00, 0x40, 0x00,
				0x00, 0xff, 0x00, 0x00, 0x00, 0x60, 0xfa, 0x00, 0x00, 0x00,
				0x00, 0xff, 0x00, 0x00, 0x00, 0x70,0xfa, 0x00, 0x00, 0x10,
				0x00, 0xff, 0x00, 0x00, 0x00, 0x80,0xfa, 0x00, 0x00, 0x00,
				0x00, 0xff };
		//送风模式下默认F码
		fCode[3] = new int[] { 0x0b, 0x09, 0x20, 0x50, 0xfa, 0x00, 0x40, 0x00,
				0x00, 0xff, 0x00, 0x00, 0x00, 0x60, 0xfa, 0x00, 0x00, 0x00,
				0x00, 0xff, 0x00, 0x00, 0x00, 0x70,0xfa, 0x00, 0x00, 0x00,
				0x00, 0xff, 0x00, 0x00, 0x00, 0x80,0xfa, 0x00, 0x00, 0x00,
				0x00, 0xff };
		//制热模式下默认F码
		fCode[4] = new int[] { 0x0c, 0x0c, 0x20, 0x50, 0xfa, 0x00, 0x40, 0x00,
				0x08, 0xff, 0x00, 0x00, 0x00, 0x60,0xfa, 0x00, 0x00, 0x00,
				0x00, 0xff, 0x00, 0x00, 0x00, 0x70,0xfa, 0x00, 0x89, 0x00,
				0x00, 0xff, 0x00, 0x00, 0x00, 0x80, 0xfa, 0x77, 0x77, 0x77,
				0x00, 0xff };
		//节能功能开启前备份的F码
		fCode[5] = new int[] { 0x09, 0x09, 0x20, 0x50, 0xfa, 0x00, 0x40, 0x00,
				0x00, 0xff, 0x00, 0x00, 0x00, 0x60,0xfa, 0x00, 0x00, 0x00,
				0x00, 0xff, 0x00, 0x00, 0x00, 0x70, 0xfa, 0x00, 0xa9, 0x00,
				0x00, 0xff, 0x00, 0x00, 0x00, 0x80, 0xfa, 0xbb, 0xbb, 0xab,
				0x00, 0xff };
	}
	/**
	 * 获取F码的byte数据
	 * @param mode
	 * 获取哪个模式的F码
	 * @return
	 */
	public byte[] getFcodeBytes(int mode){
		byte[] data=new byte[40];
		for(int i=0;i<40;i++){
			data[i]=(byte) fCode[mode][i];
		}
		return data;
	}
	/**
	 * 设置F码
	 * @param mode
	 * 设置哪个模式的F码
	 * @param data
	 * F码的数据
	 */
	public void setFcodeBytes(int mode,byte[] data){
		if(data.length<40){//校验数据合规性
			return;
		}else if(data[4]!=(byte) 0xfa || data[14]!=(byte) 0xfa|| data[24]!=(byte) 0xfa|| data[34]!=(byte) 0xfa){
			return;
		}
		for(int i=0;i<40;i++){
			fCode[mode][i]=data[i];
		}
	}
	/**
	 * 开关机:关机0,开机1
	 */
	public int getPower() {
		return getBits(fCode[0][0], 3, 1);
	}
	/**
	 * 开关机:关机0,开机1
	 */
	public void setPower(int power){
		if(power>1)return;
		if(getPower()==1 && power==0){
			//关机时关闭静音、健康、换气、定时关机
			setMute(0);
			setHealth(0);
			setRefresh(0);
			setSleep(0);
			setTimers(0);
		}if(getPower()==0 && power==1){
			//开机时关闭定时开机
			setTimers(0);
		}
		for(int i=0;i<5;i++){
			fCode[i][0]=getCopyBits(power,0,fCode[i][0],3,1);
		}
	}

	/**
	 * 模式：无效-1，自动0、制冷1、除湿2、送风3、制热4
	 */
	public int getMode() {
		int mode;
		if (getPower() == 0) {
			//关机时无效
			mode = -1;
		} else {
			mode = getBits(fCode[0][0], 0, 3);
		}
		return mode;
	}
	/**
	 * 强制获取模式
	 * @return
	 */
	public int forceGetMode() {
		int mode;
		mode = getBits(fCode[0][0], 0, 3);
		return mode;
	}
	/**
	 * 模式：自动0、制冷1、除湿2、送风3、制热4
	 */
	public void setMode(int mode){
		if(mode<0 ||mode>4 || getPower()==0)return;
		if(getMode()!=mode){
			//模式切换时，超强、静音、睡眠关闭
			setSuperWind(0);
			setMute(0);
			setSleep(0);
			setEco(0);
		}
		fCode[0][0]=getCopyBits(mode,0,fCode[0][0],0,3);
	}
	/**
	 * 设定温度：无效-1，16~30摄氏度
	 */
	public int getSetTemp() {
		int setTemp;
		if (getMode()==0 || getEco()==1) {
			//开机且自动模式和节能时无效
			setTemp = -1;
		}else{
			//取不同模式状态
			setTemp = getBits(fCode[forceGetMode()][1], 0, 4)+16;
		}
		return setTemp;
	}
	/**
	 * 强制获取设定温度
	 * @return
	 */
	public int forceGetSetTemp(int mode) {
		int setTemp;
		if(mode<0 || mode>4)return -1;
		setTemp = getBits(fCode[mode][1], 0, 4)+16;
		return setTemp;
	}
	/**
	 * 设定温度：无效-1，16~30摄氏度
	 */
	public void setSetTemp(int setTemp) {
		if(setTemp<16 || setTemp>30|| getPower()==0||forceGetMode()==0|| getEco()>0)return;//数值超范围和关机、自动模式状态下不能操作
		fCode[getMode()][1]=getCopyBits(setTemp-16,0,fCode[getMode()][1], 0, 4);
	}
	/**
	 * 强制设置温度
	 * @param temp
	 * @param mode
	 */
	public boolean forceSetSetTemp(int setTemp,int mode){
		if(setTemp<16 || setTemp>30|| getPower()==0||forceGetMode()==0|| getEco()>0)return false;//数值超范围和关机、自动模式状态下不能操作
		if(mode<1 || mode>4)return false;
		fCode[mode][1]=getCopyBits(setTemp-16,0,fCode[mode][1], 0, 4);
		return true;
	}
	/**
	 * 风速：无效-1，自动0、低风速1、低中风速2、中风速3、中高风速4、高风速5
	 */
	public int getFanSpeed() {
		int speed;
		if (getPower() == 0) {
			//关机时无效
			speed = -1;
		}else{
			//取不同模式状态
			speed = getBits(fCode[getMode()][27], 4, 4);
		}
		return speed;
	}
	/**
	 * 风速：自动0、低风速1、低中风速2、中风速3、中高风速4、高风速5
	 */
	public int setFanSpeed(int speed) {
		//数值超范围和关机状态和节能开启和除湿模式时不能操作
		if(speed>5 || getPower()==0 || getEco()>0|| getMode()==2)return -1;
		//风速调整，静音和超强功能关闭
		setMute(0);
		setSuperWind(0);
		//采用5档风速模式
		fCode[getMode()][27]=getCopyBits(speed,0,fCode[getMode()][27], 4, 4);
		if(speed<4){
			fCode[getMode()][0]=getCopyBits(speed,0,fCode[getMode()][0], 4, 2);
		}else{
			fCode[getMode()][0]=getCopyBits(3,0,fCode[getMode()][0], 4, 2);
		}
		return 0;
	}
	/**
	 * 上下扫风：无效-1，关0、全扫1、位置上2、位置上中3、位置中4、位置中下5、位置下6
	 */
	public int getUdSwing() {
		int udSwing;
		if(getPower()==0){
			udSwing=-1;
		}else{
			udSwing=getBits(fCode[getMode()][5], 0, 4);
		}
		return udSwing;
	}
	/**
	 * 上下扫风：关0、全扫1、位置上2、位置上中3、位置中4、位置中下5、位置下6
	 */
	public void setUdSwing(int udSwing) {
		if(udSwing>6|| getPower()==0)return;
		fCode[getMode()][5]=getCopyBits(udSwing,0,fCode[getMode()][5], 0, 4);
	}
	/**
	 * 左右扫风：无效-1，关0、全扫1、位置左2、位置左中3、位置中4、位置中右5、位置右6
	 */
	public int getLrSwing() {
		int lrSwing;
		if(getPower()==0){
			lrSwing=-1;
		}else{
			lrSwing=getBits(fCode[getMode()][5], 4, 4);
		}
		return lrSwing;
	}
	/**
	 * 左右扫风：关0、全扫1、位置左2、位置左中3、位置中4、位置中右5、位置右6
	 */
	public void setLrSwing(int lrSwing) {
		if(lrSwing>6 || getPower()==0)return;
		fCode[getMode()][5]=getCopyBits(lrSwing,0,fCode[getMode()][5], 4, 4);
	}
	
	/**
	 * 超强：无效-1，关0、开1
	 */
	public int getSuperWind() {
		int superWind;
		int m=getMode();
		if (getPower() == 0 || m==0 || m==2 || m==3|| getEco()>0 || getSleep()>0) {
			//关机和模式为自动、除湿、送风、节能开启时无效  睡眠开启时无效
			superWind = -1;
		} else {
			//取不同模式下状态
			superWind = getBits(fCode[getMode()][2], 4, 1);
		}
		return superWind;
	}
	/**
	 * 超强：关0、开1
	 */
	public void setSuperWind(int superWind) {
		//数值超范围和关机、除湿、送风、自动模式和睡眠、节能开启状态下不能操作
		int m=getMode();
		if(superWind>1 || getPower()==0||m==0||m==2||m==3||getEco()>0||getSleep()>0)return;
		if(superWind==1){
			//超强只在制冷和制热模式下有效
			fCode[getMode()][2]=getCopyBits(1,0,fCode[getMode()][2],4,1);
			//超强和静音不能同时开启
			setMute(0);
		}else{
			fCode[getMode()][2]=getCopyBits(0,0,fCode[getMode()][2],4,1);
		}
	}
	/**
	 * 静音：无效-1，关0、自动静音1、静音2
	 */
	public int getMute() {
		int mute;
		if (getPower() == 0 || getEco()>0) {
			//关机和节能开启时时无效
			mute = -1;
		} else {
			//取不同模式状态
			mute = getBits(fCode[getMode()][25], 6, 2);
		}
		return mute;
	}
	/**
	 * 静音：关0、自动静音1、静音2
	 */
	public void setMute(int mute) {
		if(mute>2 || getPower()==0||getEco()>0)return;//数值超范围和关机状态下不能操作
		fCode[getMode()][25]=getCopyBits(mute,0,fCode[getMode()][25],6,2);
		if(mute>0){
			//超强和静音不能同时开启
			setSuperWind(0);
		}
	}
	/**
	 * 健康：无效-1，关0、开1
	 */
	public int getHealth() {
		int health;
		if(getPower()==0){
			//关机状态下无效
			health=-1;
		}else{
			health=getBits(fCode[getMode()][2], 6, 1);
		}
		return health;
	}
	/**
	 * 健康：关0、开1
	 */
	public void setHealth(int health) {
		if(health>1 || getPower()==0)return;//数值超范围和关机状态下不能操作
		for(int i=0;i<5;i++){
			fCode[i][2]=getCopyBits(health,0,fCode[i][2],6,1);
		}
	}
	/**
	 * 换气：无效-1，关0、吸气1、排气2
	 */
	public int getRefresh() {
		int refresh;
		refresh=getBits(fCode[0][3], 0, 2);
		return refresh;
	}
	/**
	 * 换气：无效-1，关0、吸气1、排气2
	 */
	public void setRefresh(int refresh) {
		if(refresh>2)return;//数值超范围不能操作
		for(int i=0;i<5;i++){
			fCode[i][3]=getCopyBits(refresh,0,fCode[i][3],0,2);
		}
	}
/**
 * 温度显示：无效-1，关0、显示设定温度1、显示室内温度2、显示室外温度3
 */
public int getTempDisplay() {
	if(getPower()==0)return -1;
	int tempDisplay;
	tempDisplay=getBits(fCode[0][6], 0, 2);
	return tempDisplay;
}
/**
 * 温度显示：无效-1，关0、显示设定温度1、显示室内温度2、显示室外温度3
 */
public void setTempDisplay(int tempDisplay) {
	if(tempDisplay>3)return;//数值超范围不能操作
	for(int i=0;i<5;i++){
		fCode[i][6]=getCopyBits(tempDisplay,0,fCode[i][6],0,2);
	}
}
	/**
	 * 灯光：无效-1，关0、开1
	 */
	public int getLamp() {
		int lamp;
		lamp=getBits(fCode[0][2], 5, 1);
		return lamp;
	}
	/**
	 * 灯光：关0、开1
	 */
	public void setLamp(int lamp) {
		if(lamp>1)return;//数值超范围不能操作
		for(int i=0;i<5;i++){
			fCode[i][2]=getCopyBits(lamp,0,fCode[i][2],5,1);
		}
	}
	/**
	 * 睡眠：无效-1，关0、传统睡眠1、专家睡眠2、DIY睡眠3、午休睡眠4
	 */
	public int getSleep() {
		int sleep;
		int m=getMode();
		if(getPower()==0 || m==0|| m==2 || m==3){
			//关机、自动和送风模式及新国标除湿模式状态下无效
			sleep=-1;
		}else{
			if(getBits(fCode[getMode()][25], 3, 1)>0){
				sleep=4;
			}else{
				sleep=getBits(fCode[getMode()][25], 0, 1)*2+getBits(fCode[getMode()][0], 7, 1);
			}
		}
		return sleep;
	}
	/**
	 * 睡眠：关0、传统睡眠1、专家睡眠2、DIY睡眠3、午休睡眠4
	 */
	public void setSleep(int sleep) {
		//数值超范围和关机、自动、除湿、送风模式状态下不能操作
		int m=getMode();
		if(sleep>4 || getPower()==0|| m==0|| m==2|| m==3)return;
		if(getSleep()==0 && sleep>0){
			//进入睡眠，开启静音，若节能开启，关闭节能；退出睡眠，清除静音；
			if(getEco()>0)setEco(0);
			setMute(2);
		}if(getSleep()>0 && sleep==0){
			//退出睡眠，关闭静音；
			setMute(0);
		}
		//
		if(sleep==4){
			fCode[getMode()][25]=getCopyBits(1,0,fCode[getMode()][25],3,1);
			fCode[getMode()][0]=getCopyBits(1,0,fCode[getMode()][0],7,1);
			fCode[getMode()][25]=getCopyBits(0,1,fCode[getMode()][25],0,1);
		}else{
			fCode[getMode()][25]=getCopyBits(sleep,1,fCode[getMode()][25],0,1);
			fCode[getMode()][0]=getCopyBits(sleep,0,fCode[getMode()][0],7,1);
			fCode[getMode()][25]=getCopyBits(0,0,fCode[getMode()][25],3,1);
		}
	}
	/**
	 *获取diy睡眠各时段温度值
	 * @return
	 */
	public int[] getDiySleep(){
		int[] data=new int[8];
		int m=forceGetMode();
		data[0]=getCopyBits(fCode[m][26],0,data[0],0,4)+16;
		data[1]=getCopyBits(fCode[m][26],4,data[1],0,4)+16;
		
		data[2]=getCopyBits(fCode[m][35],0,data[2],0,4)+16;
		data[3]=getCopyBits(fCode[m][35],4,data[3],0,4)+16;
		
		data[4]=getCopyBits(fCode[m][36],0,data[4],0,4)+16;
		data[5]=getCopyBits(fCode[m][36],4,data[5],0,4)+16;
		
		data[6]=getCopyBits(fCode[m][37],0,data[6],0,4)+16;
		data[7]=getCopyBits(fCode[m][37],4,data[7],0,4)+16;
		return data;
	}
	/**
	 * 保存DIY睡眠各时段温度值
	 * @param data
	 */
	public void setDiySleep(int[] data){
		int m=forceGetMode();
		fCode[m][26]=getCopyBits(data[0]-16,0,fCode[m][26],0,4);
		fCode[m][26]=getCopyBits(data[1]-16,0,fCode[m][26],4,4);
		
		fCode[m][35]=getCopyBits(data[2]-16,0,fCode[m][35],0,4);
		fCode[m][35]=getCopyBits(data[3]-16,0,fCode[m][35],4,4);
		
		fCode[m][36]=getCopyBits(data[4]-16,0,fCode[m][36],0,4);
		fCode[m][36]=getCopyBits(data[5]-16,0,fCode[m][36],4,4);
		
		fCode[m][37]=getCopyBits(data[6]-16,0,fCode[m][37],0,4);
		fCode[m][37]=getCopyBits(data[7]-16,0,fCode[m][37],4,4);
	}
	
	/**
	 * 干燥：无效-1、关0、开1
	 */
	public int getDry() {
		int dry;
		int m=forceGetMode();
		if(m==0|| m==3|| m==4){
			//自动、制热和送风模式状态下无效
			dry=-1;
		}else{
			dry=getBits(fCode[1][2], 7, 1);
		}
		return dry;
	}
	/**
	 * 干燥：关0、开1
	 */
	public void setDry(int dry) {
		int m=forceGetMode();
		if(dry>1 || m==0|| m==3|| m==4)return;//数值超范围和自动、制热、送风模式下不能操作
		if((getPower()==0 && getDry()==1)||getPower()==1){
			//开机时可操作； 关机状态下且干燥开启时可操作
			fCode[1][2]=getCopyBits(dry,0,fCode[1][2],7,1);//制冷和除湿统一参数
			fCode[2][2]=getCopyBits(dry,0,fCode[2][2],7,1);
		}
	}
	/**
	 * 辅热：无效-1、关0、辅热2、自动辅热1
	 */
	public int getHeat() {
		int heat;
		if(getPower()==0 || getMode()!=4){
			//关机、非制热模式状态下无效
			heat=-1;
		}else{
			if(getBits(fCode[getMode()][8], 3, 1)==0 && getBits(fCode[getMode()][2], 7, 1)==1){
				heat=0;
			}else if(getBits(fCode[getMode()][8], 3, 1)==0 && getBits(fCode[getMode()][2], 7, 1)==0){
				heat=2;
			}else if(getBits(fCode[getMode()][8], 3, 1)==1 && getBits(fCode[getMode()][2], 7, 1)==0){
				heat=1;
			}else{
				heat=0;
			}
		}
		return heat;
	}
	/**
	 * 辅热：关0、辅热1、自动辅热2
	 */
	public void setHeat(int heat) {
		if(heat>2 || getPower()==0 || getMode()!=4)return;//数值超范围和关机、非制热模式下不能操作
		switch(heat){
		case 0:
			fCode[getMode()][8]=getCopyBits(0,0,fCode[getMode()][8],3,1);
			fCode[getMode()][2]=getCopyBits(1,0,fCode[getMode()][2],7,1);
			break;
		case 2:
			fCode[getMode()][8]=getCopyBits(0,0,fCode[getMode()][8],3,1);
			fCode[getMode()][2]=getCopyBits(0,0,fCode[getMode()][2],7,1);
			break;
		case 1:
			fCode[getMode()][8]=getCopyBits(1,0,fCode[getMode()][8],3,1);
			fCode[getMode()][2]=getCopyBits(0,0,fCode[getMode()][2],7,1);
			break;
		}
	}
	/**
	 * 节能：无效-1、关0、开1
	 */
	public int getEco() {
		int eco;
		if(getPower()==0|| getMode()!=1){
			//关机、自动、除湿、制热和送风模式状态下无效
			eco=-1;
		}else{
			eco=getBits(fCode[getMode()][8], 2, 1);//节能只在制冷模式下有效
		}
		return eco;
	}
	/**
	 * 节能：无效-1、关0、开1
	 */
	public void setEco(int eco) {
		if(eco>1 || getMode()!=1 || getPower()==0)return;//数值超范围和非制冷模式下不能操作
		if(getEco()==0 && eco>0){
			setMute(0);//进入节能关闭静音，节能退出时不恢复
			if(getSleep()>0)setSleep(0);//进入节能关闭睡眠，节能退出时不恢复
			setFcodeBytes(5,getFcodeBytes(1));//保存当前F码，便于退出时恢复
			setFanSpeed(0);//进入节能风速默认自动，节能退出时恢复
			setSuperWind(0);//进入节能超强关闭，节能退出时恢复
		}
		fCode[1][8]=getCopyBits(eco,0,fCode[getMode()][8],2,1);//设置eco
		if(eco==0){//退出节能时相关处理在此操作
			//setFcodeBytes(1,getFcodeBytes(5));//将备份码恢复至制冷F码
			fCode[1][0]=getCopyBits(fCode[5][0],4,fCode[1][0],4,4);//复制风速位
			fCode[1][27]=getCopyBits(fCode[5][27],4,fCode[1][27], 4, 4);//复制风速位
			fCode[1][2]=getCopyBits(fCode[5][2],4,fCode[1][2],4,1);//复制超强位
		}
	}
	/**
	 * 定时：无效-1、关0、开>0
	 */
	public int getTimers() {
		int timers=0;
		if(getBits(fCode[0][1], 7, 1) == 1){
			
			if (getBits(fCode[0][1], 6, 1) == 1){
				timers += 200;
			}else if (getBits(fCode[0][1], 5, 1) == 1){
				timers += 100;
			}
			timers += getBits(fCode[0][2], 0, 4)*10;
			if (getBits(fCode[0][1], 4, 1) == 1)timers +=5;
		}
		return timers;
	}
	/**
	 * 定时：无效-1、关0、开>0 对应关系：5-240：0.5-24.0小时
	 */
	public void setTimers(int timers) {
		int time=timers;
		int a=0;
		//f0码操作
			//开启和关闭定时
		fCode[0][1]=getCopyBits((time>0 ? 1:0),0,fCode[0][1], 7, 1);
		if((time%10)>0){
			//小数位置1
			fCode[0][1]=getCopyBits(1,0,fCode[0][1], 4, 1);
		}else{
			fCode[0][1]=getCopyBits(0,0,fCode[0][1], 4, 1);
		}
			//个位数
		fCode[0][2]=getCopyBits((time/10)%10,0,fCode[0][2], 0, 4);
		if((time/100)>1){
			//十位数位置
			fCode[0][1]=getCopyBits(1,0,fCode[0][1], 6, 1);
		}else if((time/100)>0){
			fCode[0][1]=getCopyBits(1,0,fCode[0][1], 5, 1);
		}else{
			fCode[0][1]=getCopyBits(0,0,fCode[0][1], 5, 2);
		}
		a=(time/10)*60+(time%10)*6;//计算分钟时间
		setTimersMin(a);//设定F1码中的分钟数
	}
	/*
	 * time:F0码小时时间；minTime:F1码分钟时间
	 */
	public void setTimersMin(int minTime){
		//f1码操作
		if(getPower()==0){
			fCode[0][18]=getCopyBits(minTime>0 ? 1:0,0,fCode[0][18], 1, 1);//开启和关闭定时开机
			fCode[0][18]=getCopyBits(0,0,fCode[0][18], 0, 1);//关闭定时关机
			fCode[0][15]=getCopyBits(minTime,0,fCode[0][15], 0, 8);//设置定时时间
			fCode[0][16]=getCopyBits(minTime,8,fCode[0][16], 0, 3);//设置定时时间
		}else{
			fCode[0][18]=getCopyBits((minTime>0 ? 1:0),0,fCode[0][18], 0, 1);//开启和关闭定时关机
			fCode[0][18]=getCopyBits(0,0,fCode[0][18], 1, 1);//关闭定时开机
			fCode[0][16]=getCopyBits(minTime,0,fCode[0][16], 4, 4);//设置定时时间
			fCode[0][17]=getCopyBits(minTime,4,fCode[0][17], 0, 7);//设置定时时间
		}
		//定时时间在所用空调模式下共用同一个
		//System.out.println("F1码定时："+fCode[0][18]+"-"+fCode[0][17]+"-"+fCode[0][16]+"-"+fCode[0][15]);
		synOtherCodeTimers();
	}
	private void synOtherCodeTimers(){
		for(int i=1;i<5;i++){
			fCode[i][1]=getCopyBits(fCode[0][1],4,fCode[i][1],4, 4);
			fCode[i][2]=getCopyBits(fCode[0][2],0,fCode[i][2],0, 4);
			
			fCode[i][15]=getCopyBits(fCode[0][15],0,fCode[i][15],0, 8);
			fCode[i][16]=getCopyBits(fCode[0][16],0,fCode[i][16],0, 8);
			fCode[i][17]=getCopyBits(fCode[0][17],0,fCode[i][17],0, 8);
			fCode[i][18]=getCopyBits(fCode[0][18],0,fCode[i][18],0, 2);
		}
	}
	/**
	 *声明获取38kHz的F码的字符串缓存
	 */
	private StringBuffer fCodeStr;
	private int Fhz=37878;//约为26.4微秒
	/**
	 *获取F码转换成指定sendFhz频率的字符串
	 */
	public String getRateFcodeStr(){
		getRateFcode();
		//System.out.println(fCodeStr.toString());
		return fCodeStr.toString();
	}
	
	
	/**
	 *获取F码转换成指定sendFhz频率的字符串
	 *对F0~F3码进行一层解析
	 */
	private void getRateFcode() {
		fCodeStr = null;
		if (fCodeStr == null) {
			fCodeStr = new StringBuffer();
		}
		fCodeStr.append(Fhz);
		int i,j;
		int[] datas=null;
		int[] data= new int[9];
		int endTime=36000;
//		int currentMode=forceGetMode();//获取当前空调模式
		int currentMode= 0;
		for(i=0;i<4;i++){
			if(i==1 && getTimers()==0)continue;//定时开启才发送F1码,否则跳过
			if(i==2 && getSleep()!=3)endTime=0;//DIY睡眠不开启即不发F3码，所有清除结束时间，降低发码时长，提高效率
			if(i==3 && getSleep()!=3)continue;//DIY睡眠开启才发送F3码,否则跳过
			for(j=0;j<9;j++){
				if(j<3){
					//保证F0-F3码前3个字节相同
					data[j]=fCode[currentMode][j];
				}else{
					data[j]=fCode[currentMode][i*10+j];
					//保证F0-F3码第4个字节低4位相同
					if(j==3)data[j]=getCopyBits(fCode[currentMode][j],0,data[j],0,4);
				}
			}
			getRateTranBytes(data, endTime);
		}
	}

	/**
	 *获取F码转换成指定sendFhz频率的字符串
	 *对F0~F3码进行二层解析
	 *获取字节数组转换成单位周期个数的值
	 */
	private void getRateTranBytes(int datas[], int delay) {
		int i;
		int temp = 0;
		int[] data=datas;
		// 计算校验码，和校验
		for (i = 0; i < 8; i++) {
			if (i < 5)
				temp += data[i] & 0x0F;
			else
				temp += (data[i] >> 4) & 0x0F;
		}
		data[8] &= 0x0f;
		data[8] |= ((temp & 0x0F) << 4);
		//添加头码，9ms高电平，4.5ms电平
		fCodeStr.append("," + getRateCodeTranTime(9000) + "," + getRateCodeTranTime(4500));// 头码
		//开始字节转换
		for (i = 0; i < 4; i++) {
			getRateTranBits(8, data[i], 0);
		}
		
		//处理Nibble9 和Nibble10
		getRateTranBits(3, data[i], 0);
		getRateTranBits(1, data[i] >> 3, 18000);
		getRateTranBits(4, data[i] >> 4, 0);//add 2015-11-11
		
		//处理密码部分Nibble11 - Nibble16，Update 2015-11-11
		//for (i = 5; i < 9; i++) {
		for (i = 5; i < 8; i++) {
			getRateTranBits(8, data[i], 0);
		}
		
		//发校验 Nibble17   add 2015-11-11
		getRateTranBits(4, data[8], 0);
		
		//尾码
		getRateTranBits(1, 0xff, delay);
	}

	/**
	 *获取F码转换成指定sendFhz频率的字符串
	 *对F0~F3码进行三层解析
	 * 获取单个字节转换成单位周期个数的值
	 */
	private void getRateTranBits(int n, int data, int delay) {
		int flag;
		int temp;
		int i;
		temp = data;
		for (i = 0; i < n; i++) {
			flag = 0x01 & temp;
			if (flag > 0) {
				fCodeStr.append("," + getRateCodeTranTime(630) + ","
						+ getRateCodeTranTime(1660 + delay));
			} else {
				fCodeStr.append("," + getRateCodeTranTime(630) + ","
						+ getRateCodeTranTime(560 + delay));
			}
			temp = temp >> 1;
		}

	}

	/**
	 *获取F码转换成指定sendFhz频率的字符串
	 *对F0~F3码进行四层解析
	 * 获取转换为以(10^6/Fhz)周期为单位的数值
	 */
	private int getRateCodeTranTime(int param) {
		//return (int) (param);//android 5
		return (int) (param / (1000000 / Fhz));//android 4
	}
	
	/**
	 * 获取数据的指定起始位和长度的值
	 * data:数据源、start:起始位，从0开始、length:长度
	 */
	private int getBits(int data, int start, int length) {
		return (data >> start) & (~(~0 << length));
	}

	
	/**
	 * 复制数据的指定长度到目的数据的指定起始位和长度
	 * sData:数据源、sStart:数据源起始位，gData目的数据、sStart:目的数据起始位、length:复制的长度
	 */
	private int getCopyBits(int sData,int sStart,int gData, int gStart, int length) {
		int sdata =sData;
		int gdata=gData;
		int t=~0>>>(32-length);
		gdata=(((sdata>>sStart)&t)<<gStart)|(gdata&(~(t<<gStart)));
		//System.out.println("udcode:"+gdata);
		return gdata;
	}
	
	/**
	 * 获取开机密码的byte数据
	 * @param password
	 * @author wuhs 20151110
	 */
	public int[] getPassCodeBytes(String password){
		Character[] passcode = new Character[]{
				'0','0','0','0','0','0','F','0','0','B','0','0','0','0','0','0','0','0'
		};
		char[] c = password.toCharArray();
		
		passcode[10] = c[4];
		passcode[11] = c[5];
		passcode[12] = c[2];
		passcode[13] = c[3];
		passcode[14] = c[0];
		passcode[15] = c[1];
		
		int w = 0;
		for (int i = 0; i < passcode.length; i++) {//将低位相加，得出最后一位的10进制数
			if(i%2!=0){
				int a = Integer.parseInt(passcode[i].toString(),16);//声明该字符串的数值为16进制，int类型为10进制
				w = w + a;
			}
		}
		String hex = Integer.toHexString(w & 0xFF);//将10进制的int转为16进制的字符串
		passcode[17] = hex.length()>1?hex.charAt(1):hex.charAt(0);//将得出的16进制高位赋值到最后一位
		
		
		int[] data= new int[9];
		for (int i = 0; i < passcode.length; i+=2) {//将高低位拼接成完整的数组
			String mun = passcode[i].toString()+passcode[i+1].toString();
			data[i/2] = Integer.parseInt(mun,16);
		}
		
		return data;
	}
	
	/**
	 *获取F码转换成指定sendFhz频率的字符串
	 *重写该方法，wuhs 20151111
	 */
	public String getRateFcodeStr(int[] data){
		getRateFcode(data);
		Log.d("getRateFcodeStr", fCodeStr.toString());
		return fCodeStr.toString();
	}
	/**
	 *重写该方法，直接传入编写好的开机密码字符串，wuhs 20151111
	 */
	private void getRateFcode(int[] data) {
		fCodeStr = null;
		if (fCodeStr == null) {
			fCodeStr = new StringBuffer();
		}
		fCodeStr.append(Fhz);
		int endTime=36000;
		getRateTranBytes(data, endTime);
	}
}
